package librairies.arborescence;

import librairies.arborescence.arbre.ArbreDC;
import librairies.arborescence.interfaces.IArbre;
import librairies.exception.ArbreCyclique;
import librairies.exception.GreffeDeSousArbre;
import librairies.exception.SousArbreIncoherent;

import org.junit.Test;

public class ArbreDCTest
{
	@Test
	public void testexecut() throws NullPointerException, ArbreCyclique, GreffeDeSousArbre, SousArbreIncoherent	//ok
	{
		IArbre<Integer> a7 = new ArbreDC<Integer>(7);
		IArbre<Integer> a8 = new ArbreDC<Integer>(8);
		IArbre<Integer> a10 = new ArbreDC<Integer>(10);
		IArbre<Integer> a11 = new ArbreDC<Integer>(11);
		IArbre<Integer> a12 = new ArbreDC<Integer>(12);
		IArbre<Integer> a5 = new ArbreDC<Integer>(5);
		IArbre<Integer> a2 = new ArbreDC<Integer>(2);
		IArbre<Integer> a3 = new ArbreDC<Integer>(3);
		IArbre<Integer> a4 = new ArbreDC<Integer>(4);
		IArbre<Integer> a9 = new ArbreDC<Integer>(9);
		a9.addChild(a10).addChild(a11).addChild(a12);
		a4.addChild(a8).addChild(a9);
		a3.addChild(a7);
		a2.addChild(a3).addChild(a4).addChild(a5);
		System.out.println(a2);
		System.out.println("Valeur de la racine 8 : " + a8.getVal());
		System.out.println("Mise à jour 8->120565 (ancienne valeur : "
				+ a8.setVal(120565) + ")");
		System.out.println("Mise à jour 7->99 (ancienne valeur : "
				+ a7.setVal(99) + ")");
		System.out.println("Arbre à jour :\n" + a2);
		System.out.println("Nombre de descendants de 2 : " + a2.familySize()
				+ " ; hauteur de 2 : " + a2.height());
		System.out.println("Nombre de descendants de 4 : " + a4.familySize()
				+ " ; hauteur de 4 : " + a4.height());
		System.out.println("Nombre de descendants de 12 : " + a12.familySize()
				+ " ; hauteur de 12 : " + a12.height());
		System.out.println("Père de 9 : \n" + a9.father());
		System.out.println("Père de 2 : \n" + a2.father());

		IArbre<Integer> a39 = new ArbreDC<Integer>(39);
		IArbre<Integer> a41 = new ArbreDC<Integer>(41);
		a39.addChild(a41);
		System.out.println("Arbre 2 :\n" + a2);
		System.out.println("Arbre 9 :\n" + a9);
		System.out.println("Arbre 39 :\n" + a39);
		a3.addChild(a39);
		System.out.println("Arbre 2 :\n" + a2);
		System.out.println("Père de 39 :\n"+ a39.father());
		System.out.println("*** Changement de place pour 9 ***");
		a7.addChild(a4.cutChild(1));
		System.out.println("Arbre 2 :\n" + a2);
		System.out.println("*** Changement de place pour 3 ***");
		a4.addChild(1, a2.cutChild(0));
		System.out.println("Arbre 2 :\n" + a2);

		System.out.println("#### ARBRE DE REFERENCE :\n" + a2);
		System.out.println("#### Ancêtres de 9 :\n" + a9.ancestors());
		System.out.println("#### Premier ancêtre de 9 :\n" + a9.ancestor());
		System.out.println("#### FRERES DE 11 :\n" + a11.brothers());
		System.out.println("#### FRERES DE 9 :\n" + a9.brothers());
		System.out.println("#### FRERES DE 39 :\n" + a39.brothers());
		System.out.println("#### FRERES DE 3 :\n" + a3.brothers());
		System.out.println("#### FRERES DE 2 :\n" + a2.brothers());

		System.out.println("#### ARBRE DE REFERENCE :\n" + a2);
		System.out.println("#### Génération 0 :\n" + a2.gen(0));
		System.out.println("#### Génération 1 :\n" + a2.gen(1));
		System.out.println("#### Génération 2 :\n" + a2.gen(2));
		System.out.println("#### Génération 3 :\n" + a2.gen(3));
		System.out.println("#### Génération 4 :\n" + a2.gen(4));

		System.out.println("#### ARBRE DE REFERENCE :\n" + a2);
		System.out.println("Parcours préfixe de l'arbre 2     : " + a2.prefixe());
		System.out.println("Parcours postfixe de l'arbre 2    : " + a2.postfixe());
		System.out.println("Parcours par niveaux de l'arbre 2 : " + a2.largeur());

		System.out.println("**** valeur du père de 3  : "+ a3.father().getVal());
		System.out.println("**** valeur du père de 4  : "+ a4.father().getVal());
		System.out.println("**** valeur du père de 39 : "+ a39.father().getVal());
		System.out.println("**** valeur du père de 5  : "+ a5.father().getVal());
		System.out.println("*** Découpage des enfants de 2 ***");
		a2.cutAll();
		System.out.println("Arbre 2 :\n" + a2);
		System.out.println("**** père de 3  : " + a3.father());
		System.out.println("**** père de 4  : " + a4.father());
		System.out.println("**** père de 39 : " + a39.father());
		System.out.println("**** père de 5  : " + a5.father());
		/*
		 2             
		+-+----------+
		3 4          5
		| +-+         
		7 8 9         
		    +--+--+   
		    10 11 12  
		
		Valeur de la racine 8 : 8
		Mise à jour 8->120565 (ancienne valeur : 8)
		Mise à jour 7->99 (ancienne valeur : 7)
		Arbre à jour :
		2                   
		+--+---------------+
		3  4               5
		|  +------+         
		99 120565 9         
		          +--+--+   
		          10 11 12  
		
		Nombre de descendants de 2 : 9 ; hauteur de 2 : 3
		Nombre de descendants de 4 : 5 ; hauteur de 4 : 2
		Nombre de descendants de 12 : 0 ; hauteur de 12 : 0
		Père de 9 : 
		4              
		+------+       
		120565 9       
		       +--+--+ 
		       10 11 12
		
		Père de 2 : 
		null
		Arbre 2 :
		2                   
		+--+---------------+
		3  4               5
		|  +------+         
		99 120565 9         
		          +--+--+   
		          10 11 12  
		
		Arbre 9 :
		9       
		+--+--+ 
		10 11 12
		
		Arbre 39 :
		39
		| 
		41
		
		Arbre 2 :
		2                      
		+-----+---------------+
		3     4               5
		+--+  +------+         
		99 39 120565 9         
		   |         +--+--+   
		   41        10 11 12  
		
		Père de 39 :
		3    
		+--+ 
		99 39
		   | 
		   41
		
		*** Changement de place pour 9 ***
		Arbre 2 :
		2                   
		+-----------+------+
		3           4      5
		+--------+  |       
		99       39 120565  
		|        |          
		9        41         
		+--+--+             
		10 11 12            
		
		*** Changement de place pour 3 ***
		Arbre 2 :
		2                   
		+------------------+
		4                  5
		+------+            
		120565 3            
		       +--------+   
		       99       39  
		       |        |   
		       9        41  
		       +--+--+      
		       10 11 12     
		
		#### ARBRE DE REFERENCE :
		2                   
		+------------------+
		4                  5
		+------+            
		120565 3            
		       +--------+   
		       99       39  
		       |        |   
		       9        41  
		       +--+--+      
		       10 11 12     
		
		#### Ancêtres de 9 :
		( 2                   
		+------------------+
		4                  5
		+------+            
		120565 3            
		       +--------+   
		       99       39  
		       |        |   
		       9        41  
		       +--+--+      
		       10 11 12     
		 4                 
		+------+          
		120565 3          
		       +--------+ 
		       99       39
		       |        | 
		       9        41
		       +--+--+    
		       10 11 12   
		 3          
		+--------+ 
		99       39
		|        | 
		9        41
		+--+--+    
		10 11 12   
		 99      
		|       
		9       
		+--+--+ 
		10 11 12
		 )
		#### Premier ancêtre de 9 :
		2                   
		+------------------+
		4                  5
		+------+            
		120565 3            
		       +--------+   
		       99       39  
		       |        |   
		       9        41  
		       +--+--+      
		       10 11 12     
		
		#### FRERES DE 11 :
		( 10
		 12
		 )
		#### FRERES DE 9 :
		( )
		#### FRERES DE 39 :
		( 99      
		|       
		9       
		+--+--+ 
		10 11 12
		 )
		#### FRERES DE 3 :
		( 120565
		 )
		#### FRERES DE 2 :
		( )
		#### ARBRE DE REFERENCE :
		2                   
		+------------------+
		4                  5
		+------+            
		120565 3            
		       +--------+   
		       99       39  
		       |        |   
		       9        41  
		       +--+--+      
		       10 11 12     
		
		#### Génération 0 :
		( )
		#### Génération 1 :
		( 4                 
		+------+          
		120565 3          
		       +--------+ 
		       99       39
		       |        | 
		       9        41
		       +--+--+    
		       10 11 12   
		 5
		 )
		#### Génération 2 :
		( 120565
		 3          
		+--------+ 
		99       39
		|        | 
		9        41
		+--+--+    
		10 11 12   
		 )
		#### Génération 3 :
		( 99      
		|       
		9       
		+--+--+ 
		10 11 12
		 39
		| 
		41
		 )
		#### Génération 4 :
		( 9       
		+--+--+ 
		10 11 12
		 41
		 )
		#### ARBRE DE REFERENCE :
		2                   
		+------------------+
		4                  5
		+------+            
		120565 3            
		       +--------+   
		       99       39  
		       |        |   
		       9        41  
		       +--+--+      
		       10 11 12     
		
		Parcours préfixe de l'arbre 2     : ( 2 4 120565 3 99 9 10 11 12 39 41 5 )
		Parcours postfixe de l'arbre 2    : ( 120565 10 11 12 9 99 41 39 3 4 5 2 )
		Parcours par niveaux de l'arbre 2 : ( 2 4 5 120565 3 99 39 9 41 10 11 12 )
		**** valeur du père de 3  : 4
		**** valeur du père de 4  : 2
		**** valeur du père de 39 : 3
		**** valeur du père de 5  : 2
		*** Découpage des enfants de 2 ***
		Arbre 2 :
		2
		
		**** père de 3  : 4                 
		+------+          
		120565 3          
		       +--------+ 
		       99       39
		       |        | 
		       9        41
		       +--+--+    
		       10 11 12   
		
		**** père de 4  : null
		**** père de 39 : 3          
		+--------+ 
		99       39
		|        | 
		9        41
		+--+--+    
		10 11 12   
		
		**** père de 5  : null
		
		*/
	}
}
